package com.unitd.modules.sys.controller;

import com.alibaba.fastjson.JSON;
import com.github.pagehelper.PageInfo;
import com.unitd.comm.constant.ToolConstant;
import com.unitd.comm.web.BaseController;
import com.unitd.frame.comm.tree.Ztree;
import com.unitd.frame.comm.utils.BeanUtils;
import com.unitd.frame.comm.utils.MapUtils;
import com.unitd.frame.comm.utils.StringUtils;
import com.unitd.frame.springweb.controller.result.AjaxResult;
import com.unitd.frame.sso.annotation.Action;
import com.unitd.frame.sso.annotation.Permission;
import com.unitd.modules.sys.entity.SysOrg;
import com.unitd.modules.sys.service.ISysOrgService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.List;
import java.util.Map;

/**
 * @desc 机构信息管理View端控制器类
 * @filename SysOrgController.java
 * @copyright www.unitd.com
 * @author Hudan
 * @version 1.0
 * @date 2017-04-26
 */
@Controller
@RequestMapping("/sys/sysOrg")
public class SysOrgController extends BaseController {

	@Autowired
	private ISysOrgService sysOrgService;

	/**
	 * @desc 转到信息列表页
	 * @return 列表页地址
	 */
	@Permission("sys:sysOrg:list")
	@RequestMapping("/list")
	public String toList(Model model) {
		// 取出有效的按照层级关系进行排序的树状结构列表
		List<Ztree> result =  sysOrgService.getSysOrgTrees();

		// 将组装后的树结构的表对象信息转换成json串
		model.addAttribute("orgs", JSON.toJSONString(result));
		model.addAttribute("parentNo", getSSOToken().getOrgNo()); 			// 默认为当前登录用户所在的机构
		return "/modules/sys/sysOrg/list";
	}

	/**
	 * @desc 获取信息列表json数据, 方便列表页通过ajax获取并展示
	 * @param param 前端请求参数信息
	 * @return json数据
	 */
	@Permission("sys:sysOrg:list")
	@RequestMapping("/listJson")
	@ResponseBody
	public String listJson(@RequestParam Map<String, Object> param) {

		// 获取分页数据信息
		Map<String, Integer> pageMap = getPageMap();

		// 转换页面查询参数为查询对象
		SysOrg sysOrg = new SysOrg();
		MapUtils.toBean(param, sysOrg);

		// 查询列表数据
		PageInfo<SysOrg> pageData = sysOrgService.getPageData(pageMap.get("pageNo"), pageMap.get("pageSize"), sysOrg, "findListBy");
		return jsonPage(pageData);
	}

	/**
	 * @desc 根据主键ID获取详情信息, 并将获取的信息在详情页展示转到信息列表页
	 * @return 详情页地址及数据
	 */
	@Permission("sys:sysOrg:view")
	@RequestMapping("/toView/{id}")
	public String toView(Model model, @PathVariable("id") String id) {
		SysOrg sysOrg = sysOrgService.findBy(id);
		model.addAttribute("sysOrg", sysOrg);
		model.addAttribute("action", "doView");
		return "/modules/sys/sysOrg/edit";
	}

	/**
	 * @desc 根据主键ID获取详情信息, 并将获取的信息在详情页展示转到信息列表页
	 * @return 详情页地址及数据
	 */
	@Permission("sys:sysOrg:edit")
	@RequestMapping(value = "/toEdit/{id}")
	public String toEdit(Model model, @PathVariable("id") String id) {
		SysOrg sysOrg = sysOrgService.findBy(id);
		model.addAttribute("sysOrg", sysOrg);
		return "/modules/sys/sysOrg/edit";
	}

	/**
	 * @desc 处理详情信息的新增/修改操作
	 * @param model springMVC的数据模型对象
	 * @param sysOrg 需要新增/修改的详情信息
	 * @param param 前端请求参数集合
	 * @return 操作结果
	 */
	@Permission("sys:sysOrg:edit")
	@RequestMapping("/doEdit")
	@ResponseBody
	public AjaxResult doEdit(Model model, SysOrg sysOrg, @RequestParam Map<String, Object> param) {
		// 调用Hibernate-validate进行数据校验
		String validatMsg = beanValidator(model, sysOrg);
		if(!StringUtils.isNull(validatMsg)) {
			return new AjaxResult(false, "处理数据失败![" +validatMsg+"]");
		}

		// 将数据存入Map对象,方便service使用
		param.put(SysOrg.class.getName(), sysOrg);
		param.put(ToolConstant.USER_TOKEN_ID, getSSOToken().getUid()); 						// 当前的登录用户主键
		param.put(ToolConstant.USER_TOKEN_NAME, getSSOToken().getUname()); 					// 当前的登录用户名

		// 调用service,处理数据保存
		sysOrgService.doEdit(param);

		// 根据处理结果,反馈给前端
		return new AjaxResult(true);
	}

	/**
	 * @desc 根据主键ID, 删除对应的详情信息
	 * @param ids 需要删除的详情信息ID串,多个ID之间用,分割
	 * @return 删除结果
	 */
	@Permission("sys:sysOrg:delete")
	@RequestMapping("/doDelete/{id}")
	@ResponseBody
	public AjaxResult doDelete(@PathVariable("id") String ids) {
		// 根据ID删除信息
		sysOrgService.doDelete(ids);

		// 根据处理结果,反馈给前端
		return new AjaxResult(true);
	}

	/**
	 * @desc 转到选择已配置的数据表信息树的页面\
	 * @param model SpringMVC的数据模型对象
	 * @param param 请求参数
	 * @return
	 */
	@Permission(action = Action.Skip)
	@RequestMapping("/toTree")
	public String toTree(Model model, @RequestParam Map<String, Object> param) {
		// 取出有效的按照层级关系进行排序的树状结构机构列表
		List<Ztree> result =  sysOrgService.getSysOrgTrees();
		// 将组装后的树结构的表对象信息转换成json串
		model.addAttribute("orgs", JSON.toJSONString(result));

		if(!BeanUtils.isNull(param.get("parentNo"))) {
			model.addAttribute("parentNo", param.get("parentNo"));
			return "/modules/sys/sysOrg/pTree";
		} else {
			model.addAttribute("parentNo", param.get("orgNo"));
			return "/modules/sys/sysOrg/tree";
		}
	}

	/**
	 * @desc 根据选择的机构父ID获取该父机构下的最大sort值并+1
	 * @param parentNo 请求参数 机构父ID
	 * @return
	 */
	@Permission(action = Action.Skip)
	@RequestMapping("/getMaxSortByPNo/{parentNo}")
	@ResponseBody
	public AjaxResult getMaxSortByPNo(@PathVariable("parentNo") String parentNo) {
		Integer sort = sysOrgService.getMaxSortByPNo(parentNo);

		return new AjaxResult(sort);
	}
}